package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.InventarioDAO;
import pe.com.casadesign.domain.Guia;
import pe.com.casadesign.domain.Inventario;
import pe.com.casadesign.domain.Item;
import pe.com.casadesign.domain.LineaGuia;
import pe.com.casadesign.domain.LineaGuiaItem;
import pe.com.casadesign.domain.LineaInventario;
import pe.com.casadesign.domain.LineaInventarioBulto;
import pe.com.casadesign.domain.ListaInventario;
import pe.com.casadesign.domain.ListaLineaInventario;
import pe.com.casadesign.domain.ListaLineaInventarioBulto;
import pe.com.casadesign.domain.ListaSolicitud;
import pe.com.casadesign.domain.OperacionError;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.Solicitud;
import pe.com.casadesign.service.InventarioService;
import pe.com.casadesign.service.util.Constantes;

/**
 * Implementacion de InventarioService.
 * 
 * @author Pedro Vera
 * 
 */
@Service
public class InventarioServiceImpl implements InventarioService {
	private static final Logger logger = LoggerFactory.getLogger(InventarioServiceImpl.class);

    @Autowired
    private InventarioDAO inventarioDAO;
    
	@Override
	public Inventario obtenerInventario(Inventario inventario) {
		return inventarioDAO.obtenerInventario(inventario);
	}

	@Override
	public OperacionResultado registrarInventario(Inventario inventario) {
		boolean resultado = inventarioDAO.registrarInventario(inventario);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(inventario.getCodInventario()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}

	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarInventario(Inventario inventario) {
		boolean resultado = inventarioDAO.modificarInventario(inventario)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(inventario.getCodInventario()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	
	@Override
	public OperacionResultado procesarInventario(Inventario inventario) {
		OperacionError operacionError = null;
		OperacionResultado operacionResultado = null;
		boolean resultado = false;
		
		// Instanciando operacionResultado
		operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(Constantes.NO);
		
		// Obteniendo la lista de lineas del inventario
		ListaLineaInventario listaLineaInventario = inventario.getListaLineaInventario();
		
		// Obteniendo la primera linea del listado
		LineaInventario lineaInventario = listaLineaInventario.getLista().get(0);
		
		// Obteniendo datos del a inventariar
		LineaInventario lineaInventarioObtenido = inventarioDAO.validarDetalleInventario(lineaInventario);
		
		// Validar si el item existe en la BD
		if (lineaInventarioObtenido != null){ // Sino existe
			// Generando Error del tipo de negocio
			operacionError = new OperacionError();
			operacionError.setDescripcion("Componente ya Inventariado");
			operacionError.setTipo(Constantes.TIPO_ERROR_NEGOCIO);
			
			// Estableciendo error generado
			operacionResultado.setOperacionError(operacionError);
		}else{			
			// Registrar bulto en el inventario
			resultado = inventarioDAO.registrarDetalleInventario(lineaInventario);
			operacionResultado .setCodigoGenerado(String.valueOf(lineaInventario.getInventario().getCodInventario()));
			operacionResultado .setEsOK(resultado ? Constantes.SI : Constantes.NO);
 		   		
			}
 		   
		return operacionResultado;
	}
	
	
	@Override
	public OperacionResultado procesarInventarioBulto(Inventario inventario) {
		OperacionError operacionError = null;
		OperacionResultado operacionResultado = null;
		boolean resultado = false;
		
		// Instanciando operacionResultado
		operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(Constantes.NO);
						
		// Obteniendo la lista de lineas del inventario
		ListaLineaInventarioBulto listaLineaInventarioBulto = inventario.getListaLineaInventarioBulto();
		
		// Obteniendo la primera linea del listado
		LineaInventarioBulto lineaInventarioBulto = listaLineaInventarioBulto.getLista().get(0);
		
		// Obteniendo datos del a inventariar
		LineaInventarioBulto lineaInventarioBultoObtenido = inventarioDAO.validarDetalleInventarioBulto(lineaInventarioBulto);
		
		// Validar si el item existe en la BD
		if (lineaInventarioBultoObtenido != null){ // Sino existe
			// Generando Error del tipo de negocio
			operacionError = new OperacionError();
			operacionError.setDescripcion("Componente ya Inventariado");
			operacionError.setTipo(Constantes.TIPO_ERROR_NEGOCIO);
			
			// Estableciendo error generado
			operacionResultado.setOperacionError(operacionError);
		}else{			
			// Registrar bulto en el inventario
			resultado = inventarioDAO.registrarDetalleInventarioBulto(lineaInventarioBulto);
			operacionResultado .setCodigoGenerado(String.valueOf(lineaInventarioBulto.getInventario().getCodInventario()));
			operacionResultado .setEsOK(resultado ? Constantes.SI : Constantes.NO);
 		   		
			}
 		   
		return operacionResultado;
	}
	
	@Override
	public ListaInventario listarInventario(Inventario inventario) {
		return inventarioDAO.listarInventario(inventario);
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado actualizarEstadoInventario(Inventario inventario) {
		boolean resultado = inventarioDAO.actualizarEstadoInventario(inventario)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(inventario.getCodInventario()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
}
